
#include <config.h>
#include <string.h>
#include <stdlib.h>

#include "input_manager.h"

static PT_InputOpr s_ptInputOprHead;	//链表头

/* 函数名：		 注册函数
 * 函数功能：构建一个链表：把多个拓展文件的结构体“串”起来
 * 函数实现：根据传入的结点，首先判断该链表头是否为空
 *				空则，头结点指向传入的节点，且把节点的ptNext域指向NULL
 *				不空则，尾插法插入链表
 */
int RegisterInputOpr(PT_InputOpr ptInputOpr)
{
	PT_InputOpr ptTmp;

	if (!s_ptInputOprHead)
	{
		s_ptInputOprHead   = ptInputOpr;
		ptInputOpr->ptNext = NULL;
	}
	else
	{
		ptTmp = s_ptInputOprHead;
		while (ptTmp->ptNext)
		{
			ptTmp = ptTmp->ptNext;
		}
		ptTmp->ptNext	  = ptInputOpr;
		ptInputOpr->ptNext = NULL;
	}

	return 0;
}

/* 显示支持拓展文件的名字 */
void ShowInputOpr(void)
{
	int i = 0;
	PT_InputOpr ptTmp = s_ptInputOprHead;

	while (ptTmp) {
		printf("%02d %s\n", i++, ptTmp->name);
		ptTmp = ptTmp->ptNext;
	}
}

/* 初始化函数 */
int InputInit(void)
{
	int error;
	
	error = StdinInit();

	return error;
}

/* 调用所有的Input设备的事件发生函数，即轮询的方式获取LCD或标准输入的数据 */
int GetInputEvent(PT_InputEvent ptInputEvent)
{
	/* 把链表中的InputOpr的GetInputEvent都调用一次，一旦有数据立即返回 */
	PT_InputOpr ptTmp;

	ptTmp = s_ptInputOprHead;
	
	while (ptTmp) {
		if (ptTmp->GetInputEvent(ptInputEvent) == 0)
			return 0;
		ptTmp = ptTmp->ptNext;
	}

	return -1;
}

/* 初始化所有支持的Input设备 */
int AllInputDeviceInit()
{
	int error;
	PT_InputOpr ptTmp;

	error = -1;
	ptTmp = s_ptInputOprHead;
	
	while (ptTmp) {
		if (ptTmp->DeviceInit() == 0)
			error = 0;
		ptTmp = ptTmp->ptNext;
	}

	return 0;
}
